package com.wanggsx.library.util.fun.location;

import android.content.Context;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;

public class LocationUtil {
    // 纬度
    private static double lat = 0;
    // 经度
    private static double lon = 0;
    private static String city = null;
    private static String cityCode = null;
    static MyLocationListenner myListener = new MyLocationListenner();
    static LocationClient mLocClient;
    //是否定位完成
    public static boolean isFinish = false;
    public static boolean isLocationContinue = false;
    private static LocationListener mListener = null;

    /**
     * 更新回调
     *
     * @param listener
     */
    public static void updateLocationListener(LocationListener listener) {
        mListener = listener;
    }

    /**
     * 由地理位置返回城市名称
     *
     * @param context
     * @return
     */
    public static void startGetLocation(Context context, LocationListener listener) {
        if (mLocClient != null) {
            mLocClient.stop();
        }
        // 定位初始化
        mLocClient = new LocationClient(context);
        mListener = listener;
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);// 可选，默认高精度，设置定位模式，高精度，低功耗，仅设备
        option.setCoorType("gcj02");// 可选，默认gcj02，设置返回的定位结果坐标系
        int span = 1000;
        option.setScanSpan(span);// 可选，默认0，即仅定位一次，设置发起定位请求的间隔需要大于等于1000ms才是有效的
        option.setIsNeedAddress(true);// 可选，设置是否需要地址信息，默认不需要
        option.setOpenGps(true);// 可选，默认false,设置是否使用gps
        option.setLocationNotify(true);// 可选，默认false，设置是否当gps有效时按照1S1次频率输出GPS结果
        option.setIsNeedLocationDescribe(true);// 可选，默认false，设置是否需要位置语义化结果，可以在BDLocation.getLocationDescribe里得到，结果类似于“在北京天安门附近”
        option.setIsNeedLocationPoiList(true);// 可选，默认false，设置是否需要POI结果，可以在BDLocation.getPoiList里得到
        option.setIgnoreKillProcess(false);// 可选，默认false，定位SDK内部是一个SERVICE，并放到了独立进程，设置是否在stop的时候杀死这个进程，默认杀死
        option.SetIgnoreCacheException(false);// 可选，默认false，设置是否收集CRASH信息，默认收集
        option.setEnableSimulateGps(false);// 可选，默认false，设置是否需要过滤gps仿真结果，默认需要
        mLocClient.registerLocationListener(myListener);
        mLocClient.setLocOption(option);
        mLocClient.start();
    }

    public static String getCity() {
        return city;
    }

    /**
     * 定位SDK监听函数
     */
    public static class MyLocationListenner implements BDLocationListener {
        @Override
        public void onReceiveLocation(BDLocation location) {
            // map view 销毁后不再处理新接收的位置
            if (location != null) {
                lat = location.getLatitude();
                lon = location.getLongitude();
                String c = location.getCity();
                if (c != null && c.length() >= 2) {
                    city = c.substring(0, c.length() - 1);
                    cityCode = location.getCityCode();
                }
                mLocClient.unRegisterLocationListener(myListener);
                if (!isLocationContinue) {
                    mLocClient.stop();
                } else {
//                    new Thread(new Runnable() {
//                        @Override
//                        public void run() {
//                            while (true) {
//                                try {
//                                    Thread.sleep(1000);
//                                } catch (InterruptedException e) {
//                                    e.printStackTrace();
//                                }
//                                if (mListener != null) {
//                                    mListener.callback(true, city, cityCode, lat, lon);
//                                }
//                            }
//                        }
//                    }).start();
                }
                isFinish = true;
                if (mListener != null) {
                    mListener.callback(true, city, cityCode, lat, lon);
                }
            }
        }

        public void onReceivePoi(BDLocation poiLocation) {
        }
    }

    /**
     * 获取纬度
     *
     * @return
     */
    public static double getLatitude() {
        return lat;
    }

    /**
     * 获取经度
     *
     * @return
     */
    public static double getLongitude() {
        return lon;
    }

}

